package com.auicyh.tylb.utils;

import java.util.Locale;

/**
 * 作者：  Ocean 2018/8/22 10:58
 * 信息：  Oil com.auicyh.tylb.utils
 * 功能：  数据转换工具类
 * 邮箱：   1126067113@qq.com
 * 修改人：
 * 公司: 北京天元陆兵汽车科技有限公司
 * @author Ocean
 */
public class DataConversion {
    /**
     * 判断奇偶数，位运算，最后一位为1则为奇数，为0位偶数
     * @param num 用于判断的数字
     * @return 位运算，最后一位为1则为奇数，为0位偶数
     */
    public static int isOdd(int num) {
        return num & 0x01;
    }

    /**
     * Hex转整形
     * @param b b
     * @return 转换后的整数
     */
    public static int byteToInt(byte b){
        return DataConversion.hexToInt(DataConversion.byte2Hex(b));
    }

    /**
     * Hex转整形
     * @param hex 十六进制字符
     * @return 转换后的整数
     */
    public static int hexToInt(String hex) {
        return Integer.parseInt(hex, 16);
    }

    /**
     * Hex字符串转byte
     * @param hex 十六进制字符
     * @return 转换后的数
     */
    public static byte hexToByte(String hex) {
        return (byte) Integer.parseInt(hex, 16);
    }

    /**
     * 1字节转2个Hex字符
     * @param bt 一个字节
     * @return 字节的十六进制字符串表示，如bt = 255，转换后十六进制字符串表示为FF
     */
    public static String byte2Hex(Byte bt) {
        return String.format("%02x", bt).toUpperCase(Locale.getDefault());
    }

    /**
     * 字节数组转转hex字符串
     * @param btArr 字节数组转十六进制字符串
     * @return 所有字节的十六进制字符串
     */
    public static String byteArrToHex(byte[] btArr) {
        return byteArrToHex(btArr, "");
    }

    /**
     * 字节数组转转hex字符串 间隔 divider gap
     * @param btArr  字节数组转十六进制字符串
     * @param gapStr 间隔符
     * @return 所有字节的十六进制字符串
     */
    public static String byteArrToHex(byte[] btArr, String gapStr) {
        if (btArr == null) {
            return "";
        }
        StringBuilder strBuilder = new StringBuilder();
        for (byte aBtArr : btArr) {
            strBuilder.append(byte2Hex(aBtArr));
            strBuilder.append(gapStr);
        }
        return strBuilder.toString();
    }

    /**
     * 字节数组转转hex字符串
     * @param btArr 字节数组转十六进制字符串
     * @param count 从开始位置起转换的字节个数
     * @return 所有字节的十六进制字符串
     */
    public static String byteArrToHex(byte[] btArr, int count) {
        return byteArrToHex(btArr, 0, count);
    }

    /**
     * 字节数组转转hex字符串，可选长度
     * @param btArr  用于转换的字节数组
     * @param offset 开始转换的字节位置，起始位置以0开始计数
     * @param count  从开始位置起转换的字节个数，若offset + count > btArr.length，则只处理到btArr末尾
     * @return 转换后的十六进制字符串
     */
    public static String byteArrToHex(byte[] btArr, int offset, int count) {
        StringBuilder strBuilder = new StringBuilder();
        int j = offset + count > btArr.length ? btArr.length : offset + count;
        for (int i = offset; i < j; i++) {
            strBuilder.append(byte2Hex(btArr[i]));
        }
        return strBuilder.toString();
    }

    /**
     * hex字符串转字节数组
     * @param hex 十六进制字符串
     * @return 转换后的字节数组
     */
    public static byte[] hexToByteArr(String hex) {
        int nLen = hex.length();
        byte[] result;
        if (isOdd(nLen) == 1) {
            // 奇数
            nLen++;
            hex = "0" + hex;
        }
        result = new byte[(nLen / 2)];
        int j = 0;
        for (int i = 0; i < nLen; i += 2) {
            result[j] = hexToByte(hex.substring(i, i + 2));
            j++;
        }
        return result;
    }

    /**
     * 累加和、指令校验
     * @param buffer 数组
     * @param cmd    指令
     * @param len    长度
     * @param check  校验字
     * @return 校验结果
     */
    public static boolean checkData(byte[] buffer, byte cmd, int len, byte check) {
        return checkSum(buffer, len) && cmd + check == buffer[1];
    }

    /**
     * 累加和校验
     * @param buffer 数组
     * @param len    长度
     * @return 校验结果
     */
    public static boolean checkSum(byte[] buffer, int len) {
        byte sum = 0;
        for (int i = 0; i < len - 1; i++) {
            sum += buffer[i];
        }
        return sum == buffer[len - 1];
    }
}
